/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Compras.Controlador;

import CharliesCookies.MainController;
import com.dp1.pucp.Compras.DAO.OrdenCompraDAO;
import com.dp1.pucp.Compras.VIsta.DetallePedidoCompraGUI;
import com.dp1.pucp.Compras.VIsta.OrdenCompraGeneradaGUI;
import com.dp1.pucp.Modelo.Clases.Costoinsumos;
import com.dp1.pucp.Modelo.Clases.Lineaordencompra;
import com.dp1.pucp.Modelo.Clases.Lineapedidocompra;
import com.dp1.pucp.Modelo.Clases.Ordencompra;
import com.dp1.pucp.Modelo.Clases.Pedidocompra;
import com.dp1.pucp.Seguridad.DAO.LogDAO;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author ubuntu64
 */
public class DetallePedidoCompraControlador {
     private OrdenCompraDAO m;
    private DetallePedidoCompraGUI detallePedidoView;
    private BuscarPedidoCompraControlador buscarPedidoControlador;
    private ArrayList<Costoinsumos> lstCostosInsumos;
    private ArrayList<Ordencompra> lstOrdenCompra;
    private ArrayList<Lineapedidocompra> lstLineaPedido;
    private int asignoProv=0; //esta variable es paa verificar que primero asignó proveedores para generar la orden
    private int cantOrdenes=0;
    private Pedidocompra pedCompra;    
    
    public DetallePedidoCompraControlador(OrdenCompraDAO dao, DetallePedidoCompraGUI v,BuscarPedidoCompraControlador q, Pedidocompra u ){
        m = dao;
        detallePedidoView = v;
        buscarPedidoControlador=q;
        pedCompra=u;
        detallePedidoView.addCancelarListener(new cancelarListener() );
        detallePedidoView.addAsignarProvListener (new asignarProvListener(this));
        detallePedidoView.addGenerarOrdenListener(new generarOrdenesListener(this));
        detallePedidoView.setFormPedido(pedCompra);
        listarDetalle(pedCompra);
    }
    
    public void OrdenarListaPedido(ArrayList<Lineapedidocompra> lstLineaPedido){
        Lineapedidocompra pedAux;
        for (int i = 0; i<lstLineaPedido.size()-1;i++){
           for (int j=0; j<lstLineaPedido.size()-i-1; j++){
               if (lstLineaPedido.get(j+1).getProveedor().getIdproveedor()<lstLineaPedido.get(j).getProveedor().getIdproveedor()){
                   pedAux = lstLineaPedido.get(j+1);
                   lstLineaPedido.set((j+1),lstLineaPedido.get(j));
                   lstLineaPedido.set(j, pedAux);
               }
           }
        }
    }
   
    public Ordencompra crearOrdenCompra(ArrayList<Lineapedidocompra> lstlineaped){
        float cant=0, sum=0;
        
        Ordencompra orden = new Ordencompra();
        Ordencompra orden1 = new Ordencompra();
        Date fecha = new Date();
        orden.setFechasolicitud(fecha);
        orden.setFecharecepcion(null);
        orden.setEstado(1);
        orden.setProveedor(lstlineaped.get(0).getProveedor());
        orden.setPedidocompra(lstlineaped.get(0).getPedidocompra());
        orden.setCodigo(m.llenaCodigoOrden(null));
        orden.setMoneda(m.sacaMoneda());
       
        for(int i=0; i<lstlineaped.size();i++){
            sum=sum+lstlineaped.get(i).getSubtotal();
        }
        orden.setMontototal(sum);
        orden1= m.guardarOrdenCompra(orden);
        for (int i = 0; i<lstlineaped.size();i++){
            Lineaordencompra lineaorden= new Lineaordencompra();
            lineaorden.setLineapedidocompra(lstlineaped.get(i));
            lineaorden.setCantidadSolicitante(lstlineaped.get(i).getCantidad());
            lineaorden.setCantidadEntrante(cant);
            lineaorden.setCantidadFaltante(lstlineaped.get(i).getCantidad());
            lineaorden.setOrdencompra(orden1);
            m.guardarLineaOrdenCompra(lineaorden);
        }
        return orden1;
    }

     class generarOrdenesListener implements ActionListener {
         private DetallePedidoCompraControlador buc;
         public generarOrdenesListener (DetallePedidoCompraControlador buscarusr){
             buc=buscarusr;
         }
       @Override
        public void actionPerformed(ActionEvent e) { 
           //-----******VALIDACIONES******-----
           //Debo verificar primero que ha asignado proveedores 
           if (asignoProv==0)
               detallePedidoView.mostrarError("Primero debe asignar proveedores");
           else{
           lstOrdenCompra = new ArrayList<>();
           OrdenCompraGeneradaGUI p = new OrdenCompraGeneradaGUI(detallePedidoView.getPadre(), true);
           //Ordeno la listalineapedido por proveedor para generar ordenes
           OrdenarListaPedido(lstLineaPedido);
           int i=0;
           ArrayList<Lineapedidocompra> lstLineaPedAux = new ArrayList<>();
            while (i < lstLineaPedido.size()){
                
                if (i==0){ // Si es que es el primer elemento 
                  if (lstLineaPedido.size()==1){ // si es que solo es un elemento, genera la orden de compra
                      lstLineaPedAux.add(lstLineaPedido.get(i));
                        // Generar una orden de compra
                        
                        Ordencompra u = crearOrdenCompra(lstLineaPedAux);
                        cantOrdenes++;
                        lstOrdenCompra.add(u);
                        i++;
                  }
                  else{ // compara con el sgte elemento, porq no puede comparar con el anterior
                     if ( (lstLineaPedido.get(i).getProveedor().getIdproveedor()) != (lstLineaPedido.get(i+1).getProveedor().getIdproveedor())){
                        lstLineaPedAux.add(lstLineaPedido.get(i));
                        // Generar una orden de compra
                        Ordencompra u = crearOrdenCompra(lstLineaPedAux);
                        cantOrdenes++;
                        lstOrdenCompra.add(u);
                        i++;
                        lstLineaPedAux = new ArrayList<>();
                     }
                     else{ 
                         lstLineaPedAux.add(lstLineaPedido.get(i));
                        i++;
                     }
                  }
                }
                else { // para los otros elementos
                   if (i==lstLineaPedido.size()-1){ //si es el ultimo elemento
                        
                        if ( (lstLineaPedido.get(i).getProveedor().getIdproveedor()) != (lstLineaPedido.get(i-1).getProveedor().getIdproveedor())){
                            Ordencompra u = crearOrdenCompra(lstLineaPedAux);
                            lstOrdenCompra.add(u);
                            lstLineaPedAux = new ArrayList<>();
                            lstLineaPedAux.add(lstLineaPedido.get(i));
                            
                            Ordencompra ultimo = crearOrdenCompra(lstLineaPedAux);
                            cantOrdenes++;
                            lstOrdenCompra.add(ultimo);
                            i++;
                        }else{
                            lstLineaPedAux.add(lstLineaPedido.get(i));
                            // Generar una iorden de compra
                            Ordencompra u = crearOrdenCompra(lstLineaPedAux);
                            cantOrdenes++;
                            lstOrdenCompra.add(u);
                            i++;
                        }
                        
                        
                   }
                   else{ //si es cualquiera de los otros elementos 
                    if ( (lstLineaPedido.get(i).getProveedor().getIdproveedor()) != (lstLineaPedido.get(i-1).getProveedor().getIdproveedor())){
                        
                        
                        // Generar una orden de compra
                        Ordencompra u = crearOrdenCompra(lstLineaPedAux);
                        cantOrdenes++;
                        lstOrdenCompra.add(u);
                        lstLineaPedAux = new ArrayList<>();
                        lstLineaPedAux.add(lstLineaPedido.get(i));
                        i++;
                        //lstLineaPedAux = new ArrayList<>();
                    }
                    else{
                        lstLineaPedAux.add(lstLineaPedido.get(i));
                        i++;
                    }
                   }
                }
            }
            pedCompra.setNumordcompratotal(cantOrdenes);
            pedCompra.setNumordcomprafinalizadas(0);
            pedCompra.setEstado(2);
            m.guardarPedidoCompra(pedCompra);
            LogDAO.insertarLog(MainController.usuario, "Agregar Ordenes de Compra");
           OrdenCompraGeneradaControlador c = new OrdenCompraGeneradaControlador (m,p,lstOrdenCompra, buc);
            p.setVisible(true);
       } 
       }    
     }
     class asignarProvListener implements ActionListener {
        //aca validar q existan proveedores
        private DetallePedidoCompraControlador buc;
        public asignarProvListener(DetallePedidoCompraControlador buscarusr){
            buc=buscarusr;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            float costo=0;
            float cant=0;
            lstCostosInsumos = m.llenarCostos();
            
            for (int i = 0; i<lstLineaPedido.size();i++){
               for (int j=0; j<lstCostosInsumos.size(); j++){
                   
                   if ((lstLineaPedido.get(i).getTipoproducto().getIdtipoproducto() == lstCostosInsumos.get(j).getTipoproducto().getIdtipoproducto()) & (lstCostosInsumos.get(j).getProveedor().getEstado()==1)) 
                   {costo= lstCostosInsumos.get(j).getCosto();
                    cant=lstLineaPedido.get(i).getCantidad();
                    lstLineaPedido.get(i).setCosto(costo);
                    lstLineaPedido.get(i).setProveedor(lstCostosInsumos.get(j).getProveedor());
                    lstLineaPedido.get(i).setSubtotal(costo*cant);
                    asignoProv=1;
                    break;       
                           }  
               }
               
               m.guardarLineaPedidoCompra(lstLineaPedido.get(i));
             }
            
            detallePedidoView.llenaGrillaSegundo(lstLineaPedido);
        }
    
    } 
     
    public void listarDetalle(Pedidocompra u){
        lstLineaPedido = m.llenarDetallePedido(u);               
        detallePedidoView.llenaGrillaPrimero(lstLineaPedido);        
    }

       class cancelarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            detallePedidoView.dispose();
        }        
    }
       
     public void cerrarVentana(){
         buscarPedidoControlador.cerrarVentana();
         detallePedidoView.dispose();
     }   
}
